/**
 ****************************************
 * @file user_mb_data_process.h
 * @author: AnRui
 * @version 0.1
 * @date  : 2025-10-29
 * @copyright Copyright (c) 2025
 * @desc: 从机收到主机的消息 执行的自定义操作
 *
 * ***************************************
 */

#ifndef _USER_MB_DATA_PROCESS_H_
#define _USER_MB_DATA_PROCESS_H_
#include "gd32f30x.h"
#include <stdio.h>


 /**
  * @desc  : 从机输入寄存器自定义回调函数
  * @date  : 2025-10-29
  * @author: AnRui
  * @param : reg_addr - {参数说明}: 寄存器地址
  * @param : usSRegInBuf - {参数说明}: 输入寄存器缓冲区
  * @param : iRegIndex - {参数说明}: 该寄存器在输入寄存器缓冲区的索引
  * @note  : 自定义更新输入寄存器缓冲区中该寄存器地址对应的操作
  */
void eMBRegInputCallBackFunc(uint16_t reg_addr, uint16_t* data_buff, uint16_t index);



/**
 * @desc  : 从机保持寄存器读数据的自定义回调函数
 * @date  : 2025-10-29
 * @author: AnRui
 * @param : reg_addr - {参数说明}: 寄存器地址
 * @param : usSRegInBuf - {参数说明}: 保存寄存器缓冲区
 * @param : iRegIndex - {参数说明}: 该寄存器在输入寄存器缓冲区的索引
 * @note  : 自定义更新保持寄存器缓冲区中该寄存器地址对应的操作
 */
void eMBRegHoldingReadCallBackFunc(uint16_t reg_addr, uint16_t* data_buff, uint16_t index);


/**
 * @desc  : 从机保持寄存器写数据的自定义回调函数
 * @date  : 2025-10-29
 * @author: AnRui
 * @param : reg_addr - 保持寄存器协议地址（1-based）
 * @param : data - 主机下发的16bit数据
 * @note  : 根据主机数据执行自定义硬件操作（如配置参数写入硬件寄存器）
 */
void eMBRegHoldingWriteCallBackFunc(uint16_t reg_addr, uint16_t data);


/**
 * @brief  线圈读操作回调函数：遍历每个线圈地址，同步硬件状态到缓冲区
 * @details 针对主机读线圈(功能码01)请求，逐个处理每个线圈地址：
 *          1. 根据协议地址读取对应硬件状态(0=无效/关，1=有效/开)；
 *          2. 按bit位更新线圈缓冲区，确保缓冲区与硬件状态一致；
 *          3. 自动处理字节切换(bit索引0~7循环，满8位切换到下一个字节)。
 * @param  reg_addr - 起始线圈协议地址(1-based，与主机请求地址一致，如0x01对应本地地址0)
 * @param  data_buff - 线圈缓冲区指针(uint8_t类型，1字节=8个线圈bit位，与ucSCoilBuf类型匹配)
 * @param  index - 起始字节索引(data_buff的数组下标，对应第一个线圈所在的字节)
 * @param  bit_index - 起始bit索引(0~7，对应第一个线圈在字节内的位置)
 * @param  num - 需处理的线圈总数(与主机请求的usNCoils一致，确保不遗漏或多处理线圈)
 * @note   1. 未定义的协议地址用value=-1标记，不修改缓冲区，避免误操作；
 *          2. 硬件API需根据实际芯片替换(如STM32用HAL库、51单片机用sbit)；
 *          3. 日志打印可在Release版本注释，节省嵌入式资源。
 */
void eMBRegCoilsReadCallBackFunc(uint16_t reg_addr, uint8_t* data_buff,
    uint16_t index, uint16_t bit_index, uint16_t num);




/**
 * @brief  线圈写操作回调函数：根据本地缓冲区新值控制硬件
 * @param  reg_addr - 起始线圈协议地址（1-based，如0x01对应本地地址0）
 * @param  data_buff - 本地线圈缓冲区（pucCoilBuf，已写入主机下发的值）
 * @param  start_index - 起始字节索引（data_buff的下标，基于起始地址计算）
 * @param  start_bit - 起始bit索引（0~7，基于起始地址计算）
 * @param  num - 需处理的线圈总数
 */
void eMBRegCoilsWriteCallBackFunc(uint16_t reg_addr, uint8_t* data_buff,
    uint16_t start_index, uint16_t start_bit, uint16_t num);


/**
 * @brief  离散输入自定义同步函数：遍历每个离散输入地址，同步硬件状态到本地缓冲区
 * @details 针对主机读离散输入（功能码02）请求，在从缓冲区取数据前调用：
 *          1. 根据协议地址匹配硬件（如按键、故障检测引脚），读取实时状态（0=无效/未触发，1=有效/已触发）；
 *          2. 按bit位更新本地缓冲区（ucSDiscInBuf），确保缓冲区与硬件状态一致；
 *          3. 自动处理字节切换（bit索引0~7循环，满8位切换到下一个字节）。
 * @param  reg_addr - 起始离散输入协议地址（1-based，与主机请求地址一致，如0x01对应本地地址0）
 * @param  data_buff - 离散输入本地缓冲区指针（uint8_t类型，1字节=8个离散输入bit位，与ucSDiscInBuf匹配）
 * @param  start_index - 起始字节索引（data_buff的数组下标，对应第一个离散输入所在的字节）
 * @param  start_bit - 起始bit索引（0~7，对应第一个离散输入在字节内的位置）
 * @param  num - 需处理的离散输入总数（与主机请求的usNDiscrete一致，确保不遗漏）
 * @note   1. 离散输入是只读数据，仅需同步硬件→缓冲区，无需反向控制；
 *          2. 硬件API需根据实际芯片替换（如STM32用HAL库、51单片机用sbit）；
 *          3. 日志打印可在Release版本注释，节省嵌入式资源。
 */
void eMBRegDiscreteReadCallBackFunc(uint16_t reg_addr, uint8_t* data_buff,
    uint16_t start_index, uint16_t start_bit, uint16_t num);



#endif

